Mise à jour le 05/12/2021
Faire un appel HTTP

Faire un appel HTTP

1. Avec l'extension curl

Bien qu'il existe des librairies POO très efficaces (Guzzle / Symfony HTTP Client), il est toujours pratique d'avoir un bout de code PHP Vanilla sous le coude pour faire un simple appel HTTP (lorsque l'on ne souhaite ou ne peut pas utiliser composer).

Voici le code suivant qui utilise curl :

$url = "https://example.com"
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$output = curl_exec($ch);
curl_close($ch);     


📖️️La liste des options possibles est extrêmement complète : https://www.php.net/manual/fr/function.curl-setopt.php.


2. Avec Symfony HTTP Client

Autant aller sur la page officielle : https://symfony.com/doc/current/http_client.html


3. Avec Guzzle HTTP

Page officielle : https://docs.guzzlephp.org/en/stable/

L'équipe derrière Guzzle HTTP a comme assez mauvaise réputation d'avoir trop modifié son code pour que chaque version soit compatible avec les autres.

4. Avec fopen - fonction de téléchargement

Voici une fonction à utiliser dans un terminal pour télécharger un ou plusieurs fichiers (avec barre de progression et pourcentage).

📖️️Le code n'est pas de moi et provient d'un stackoverflow : https://stackoverflow.com/a/49617294


function downloadFile($url, $filePath)
{
    //echo "Retrieving http header...";
    $header = get_headers("$url");
    $pp = "0";
    //echo json_encode($header, JSON_PRETTY_PRINT);
    $key = key(preg_grep('/\bLength\b/i', $header));
    $type = key(preg_grep('/\bType\b/i', $header));
    $http = substr($header[0], 9, 3);
    $tbytes = @explode(" ",$header[$key])[1];
    $type = @explode("/",explode(" ",$header[$type])[1])[1];
    $targetSize = floor((($tbytes / 1000)/1000))." Mo";
    //echo " Target size: ".floor((($tbytes / 1000)/1000))." Mo || ".floor(($tbytes/1000))." Kb";
    $t = explode("/",$url);
    $remote = fopen($url, 'r');
    $local = fopen($filePath, 'w');
    $read_bytes = 0;
    //echo PHP_EOL;
    while(!feof($remote)) {
        $buffer = fread($remote, intval($tbytes));
        fwrite($local, $buffer);
        $read_bytes += 2048;
        $progress = min(100, 100 * $read_bytes / $tbytes);
        $progress = substr($progress,0 , 6) *4;
        $shell = 10; /* Progress bar width */
        $rt = $shell * $progress / 100;
        echo "\033[35;2m\e[0m Downloading '$url' : [".round($progress,3)."%] ".floor((($read_bytes/1000)*4))."Kb Total:" . $targetSize;
        if ($pp === $shell){$pp=0;};
        if ($rt === $shell){$rt=0;};
        echo str_repeat("█",$rt).str_repeat("=",($pp++)).">@\r";
        usleep(1000);
    }
    //echo " \033[35;2m\e[0mDone [100%]  ".floor((($tbytes / 1000)/1000))." Mo || ".floor(($tbytes/1000))." Kb   \r";
    echo PHP_EOL;
    fclose($remote);
    fclose($local);
}